// 布尔类型
let falg: boolean = null
falg = null
let num: number = 0b1010
num = undefined

let arr: number[] = [1, 2, 3, 4]
let arr1: Array<number> = [2, 3, 4, 5]

let arr3: [number, string, any] = [1, '2', 333]

let str: string = 'asdasdasdasdasdasdas'

let arr4: Array<string> = str.split(',')
console.log(arr4)

enum Color {
  Green = 3,
  Red,
  Bule,
}

enum Sex {
  男,
  女,
}

let Mycolor: string = Color[4]

console.log(Mycolor)

let sex: Sex = Sex.男
console.log(sex)

let myArr: Array<any> = []

myArr = [1, 2, 3, '2']

// object 类型
// 定义一个函数，参数是object类型，返回值也是object类型
function getObj(obj: object): object {
  console.log(obj)

  return {}
}

//console.log(getObj({ a: 1, b: 2 }))
// console.log(getObj('123'));
// console.log(getObj(new String('123')))
// console.log(getObj(String));

// 联合类型

// 需求1：定义一个函数得到一个数字或字符串
function getString(str: number | string): number | string {
  return str
}

console.log(getString(123))

// 需求2:定义一个函数得到一个数字或字符串的长度
function getStrLength(content: number | string): number {
  // return content.toString().length
  // 如果str本身就是string类型，那么是没有必要调用toString()方法的
  if ((<string>content).length) {
    return (content as string).length
  } else {
    return content.toString().length
  }
}
console.log(getStrLength('123123123213'))

/* 
通过类型断言的方式可以告诉编译器,"相信我，我知道自己在干什么"，类型断言好比其他语言里面的类型转换，
但是不进行特殊的数据检查和解构，他没有运行时的影响，
只是在编译阶段起作用。typeScript会假设你，程序猿已经进行了必须的检查

类型断言的两种形式，其一是“尖括号语法”，另一个为 as 语法


类型断言(Type Assertion):可以用手动指定一个值的类型
语法:
    方式一:<类型>值
    方式二: 值 as 类型 tsx中只能用这种方式
*/

// 类型推断

let txt = 100 //number 类型
console.log(txt)

// 定义变量时赋值了，推断为对应的类型
let a1 = 1

// 定义变量时没有赋值，推断为any类型
let a2 // any类型
a2 = 10
a2 = '111111'
